from django.shortcuts import render
# 导入类
from userweb.models import Login, Role
# 导入JsonResponse
from django.http import JsonResponse
# 导入时间日期
from datetime import datetime
# 导入Q查询
from django.db.models import Q
# 导入字符串加密模块
from utils import encrypt


def index(request):
    """展示登陆账号管理页面"""
    return render(request, 'user/account.html')


def list_values(request):
    """获取所有的账号信息"""
    # 获取传递过来的分页信息
    page = int(request.POST.get('page'))
    limit = int(request.POST.get('limit'))
    q_str = request.POST.get('queryStr')  # loginid, name, mobile, email
    status = request.POST.get('status')  # 如果0--全部  1--启用 2--禁用

    # 定义一个返回值的数据结构
    res = {'code': 0}

    # 第一次筛选：匹配学号、姓名、手机号码、邮箱
    objs = Login.objects.filter(Q(loginid__icontains=q_str) |
                                Q(name__icontains=q_str) |
                                Q(mobile__icontains=q_str) |
                                Q(email__icontains=q_str))
    # 第二次： 匹配状态
    if status == "1":
        objs = objs.filter(status=True)
    elif status == "2":
        objs = objs.filter(status=False)
    # 转换数据
    objs = list(objs.values())
    # 遍历 --- 格式化日期
    for index, value in enumerate(objs):
        # 获取相应用户属于的组
        roles_objs = list(Role.objects.filter(login__loginid=value.get('loginid')).values('id','name'))
        roles_list = []
        for item in roles_objs:
            roles_list.append({'name': item.get('name'), 'value': item.get('id')})
        # 附加到集合
        objs[index]['selected_role'] = roles_list

        # 修改创建时间
        objs[index]['create_date'] = objs[index]['create_date'].strftime('%Y-%m-%d %H:%M:%S')
        # 修改上次登陆时间（判断是否登录过）
        if objs[index]['last_login']:
            objs[index]['last_login'] = objs[index]['last_login'].strftime('%Y-%m-%d %H:%M:%S')
        else:
            objs[index]['last_login'] = "尚未登陆"
    # 获取当前页的数据
    one_page_data = objs[(page - 1) * limit: page * limit]
    # 添加返回的数据
    res['count'] = len(objs)
    res['data'] = one_page_data
    # 返回
    return JsonResponse(res)


def add_value(request):
    """添加账号"""
    # 接收传递过来的值
    rec = request.POST
    # 定义一个存储状态的变量
    status = 0
    # 判断状态是否有值
    if rec.get('status'):
        status = 1

    # 定义一个返回值的数据结构
    res = {'status': True}
    # 添加
    try:
        Login.objects.create(loginid=rec.get('loginid'), loginpwd=encrypt.md5(rec.get('loginpwd')), name=rec.get('name'),
                             status=status, mobile=rec.get('mobile'), email=rec.get('email'),
                             create_date=datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    except Exception as e:
        # 修改状态
        res['status'] = False
        # 添加错误信息
        res['error'] = "添加账号同步到数据库出现异常，具体原因：" + str(e)

    # 返回
    return JsonResponse(res)


def edit_value(request):
    """编辑账号"""
    # 接收传递过来的值
    rec = request.POST
    roles_list = rec.get('roles').split(",")
    # 定义一个存储状态的变量
    status = 0
    # 判断状态是否有值
    if rec.get('status'):
        status = 1

    # 定义一个返回值的数据结构
    res = {'status': True}
    # 添加
    try:
        # 获取当前的对象
        obj = Login.objects.get(loginid=rec.get('loginid'))
        # 逐一修改
        obj.name = rec.get('name')
        obj.status = status
        obj.mobile = rec.get('mobile')
        obj.email = rec.get('email')
        # 保存
        obj.save()

        # 获取这个角色所有的角色
        db_data = list(Role.objects.filter(login__loginid=obj.loginid).values('id'))
        db_roles = []
        for item in db_data:
            db_roles.append(item.get('id'))

        # 把角色的映射关系完成
        select_roles = []
        for item in roles_list:
            select_roles.append(int(item))

        # 需要删除的
        del_list = list(set(db_roles) - set(select_roles))
        # 需要添加的
        add_list = list(set(select_roles) - set(db_roles))

        # 遍历 -- 添加
        for item in add_list:
            # 获取角色对象
            role_obj = Role.objects.filter(id=item).first()
            # 添加映射关系
            role_obj.login.add(obj)
        # 遍历 -- 杀出
        for item in del_list:
            # 获取角色对象
            role_obj = Role.objects.filter(id=item).first()
            # 添加映射关系
            role_obj.login.remove(obj)


    except Exception as e:
        # 修改状态
        res['status'] = False
        # 添加错误信息
        res['error'] = "修改账号同步到数据库出现异常，具体原因：" + str(e)

    # 返回
    return JsonResponse(res)


def del_value(request):
    # 接收传递到后台的Logoinid
    loginid = request.POST.get('loginid')
    # 定义返回的数据集合
    res = {'status': True}
    # 开始删除
    try:
        Login.objects.filter(loginid = loginid).first().delete()
    except Exception as e:
        res['status'] = False
        res['error'] = "删除账号提交到数据库出现异常，具体原因：" + str(e)
    return JsonResponse(res)


def is_exists_account(request):
    """判断loginid是否存在"""
    # 接收传递的loginId
    login_id = request.POST.get('loginid')
    # 判断是否存在
    is_exists = Login.objects.filter(loginid=login_id).exists()
    # 判断
    if is_exists:
        return JsonResponse({'result': True})
    else:
        return JsonResponse({'result': False})


def change_pwd(request):
    """修改密码"""
    # 获取当前的id
    loginid = request.POST.get('loginid')
    password = request.POST.get('loginpwd')
    # 定义一个返回值的数据结构
    res = {'status': True}
    # 获取当前的对象
    try:
        obj = Login.objects.get(loginid=loginid)
        # 修改密码
        obj.loginpwd = encrypt.md5(password)
        # 保存
        obj.save()
    except Exception as e:
        res['status'] = False
        res['error'] = "修改密码写入到数据库出现异常，具体原因:" + str(e)

    return JsonResponse(res)


def change_login_status(request):
    """修改登陆账号的状态"""
    # 获取传递的值
    loginid = request.POST.get('loginid')
    status = request.POST.get('status')

    # 获取当前的对象
    obj = Login.objects.filter(loginid = loginid).first()
   # 判断
    if status == '1':
        obj.status = 1
    else:
        obj.status = 0
    # 保存
    obj.save()

    return JsonResponse({'status': True})